package com.chapter10.codeblock.details;

public class details_for_codeblock {
    //1.static代码块对类进行初始化,且随着类加载而执行，且执行一次，如果是普通代码块，每
    //  创建一个实例就执行一次
    static{
        System.out.println("我是静态代码块");
    }

    {
        System.out.println("我是普通代码块");
    }

    //2.类的三个加载时机:(1)创建对象实例时(2)创建子类时父类会被加载(3)访问类中的静态成员
    //  类的加载效果(1)静态属性被初始化(2)静态代码块被调用

    //3.创建一个对象时,在一个类调用顺序:
    //(1)类中的静态成员
    //(2)构造器super()
    //(3)普通成员属性
    //(4)普通代码块
    //(5)


    //4.构造器的最前面隐含了super()和调用代码块,

    public static void main(String[] args) {

        //1.验证
        //现在运行,会输出"我是静态代码块"

        //创建一个对象实例运行就会输出两句话
        new details_for_codeblock();

        //这里会输出1+3句话(一句静态三句普通)
        new details_for_codeblock();
        new details_for_codeblock();

        System.out.println("第二，三部分验证");
        //2,3验证
        D d = new D();



    }
}


class C {

    static String name = getName();

    static {
        System.out.println("我是父类C的静态代码块");  //4
    }

    public int repeat(){
        return demo();
    }

    private int a = getSum();   //5

    {
        System.out.println("我是父类C的普通代码块"); //6
    }

    public C() {
        super();
        System.out.println("我是父类C的构造器完成了初始化"); //7
    }

    public static String getName(){
        System.out.println("我是父类C的静态方法getName()由于静态属性name初始化而被调用");//3
        return  "";
    }

    public int getSum(){
        System.out.println("我是父类C的普通方法getSum()由于普通属性a被初始化而被调用");
        return 0;
    }

    public int demo(){
        System.out.println("我是父类C的普通方法demo()因为普通方法repeat()被初始化而被调用");
        return 0;
    }
}

class D {

    static {
        System.out.println("我是D的静态代码块"); //2
    }

    static String name = getName(); //1



    public int repeat(){
        return demo();
    }

    private int a = getSum();

    {
        System.out.println("我是D的普通代码块");
    }

//    public D() {
//        super();
//        System.out.println("我是D的构造器完成了初始化");
//    }

    public static String getName(){
        System.out.println("我是D的静态方法getName()由于静态属性name初始化而被调用");
        return  "";
    }

    public int getSum(){
        System.out.println("我是D的普通方法getSum()由于普通属性a被初始化而被调用");
        return 0;
    }

    public int demo(){
        System.out.println("我是D的普通方法demo()因为普通方法repeat()被初始化而被调用");
        return 0;
    }
}
